<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<link rel="STYLESHEET" href="lib.css" type='text/css' />
<link rel="SHORTCUT ICON" href="../icons/pyfav.png" type="image/png" />
<link rel='start' href='../index.html' title='Python documentation Index' />
<link rel="first" href="lib.html" title='Python library Reference' />
<link rel='contents' href='contents.html' title="Contents" />
<link rel='index' href='genindex.html' title='Index' />
<link rel='last' href='about.html' title='About this document...' />
<link rel='help' href='about.html' title='About this document...' />
<link rel="next" href="node742.html" />
<link rel="prev" href="node740.html" />
<link rel="parent" href="node737.html" />
<link rel="next" href="node742.html" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name='aesop' content='information' />
<title>21.1.3.4 Deferred translations</title>
</head>
<body>
<div class="navigation">
<div id='top-navigation-panel' xml:id='top-navigation-panel'>
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="21.1.3.3 changing languages on"
  href="node740.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="21.1.3 internationalizing your programs"
  href="node737.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="21.1.3.5 gettext() vs. lgettext()"
  href="node742.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python Library Reference</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
<b class="navlabel">Previous:</b>
<a class="sectref" rel="prev" href="node740.html">21.1.3.3 Changing languages on</a>
<b class="navlabel">Up:</b>
<a class="sectref" rel="parent" href="node737.html">21.1.3 Internationalizing your programs</a>
<b class="navlabel">Next:</b>
<a class="sectref" rel="next" href="node742.html">21.1.3.5 gettext() vs. lgettext()</a>
</div>
<hr /></div>
</div>
<!--End of Navigation Panel-->

<h3><a name="SECTION0023134000000000000000">
21.1.3.4 Deferred translations</a>
</h3>

<p>
In most coding situations, strings are translated where they are coded.
Occasionally however, you need to mark strings for translation, but
defer actual translation until later.  A classic example is:

<p>
<div class="verbatim"><pre>
animals = ['mollusk',
           'albatross',
	   'rat',
	   'penguin',
	   'python',
	   ]
# ...
for a in animals:
    print a
</pre></div>

<p>
Here, you want to mark the strings in the <code>animals</code> list as being
translatable, but you don't actually want to translate them until they
are printed.

<p>
Here is one way you can handle this situation:

<p>
<div class="verbatim"><pre>
def _(message): return message

animals = [_('mollusk'),
           _('albatross'),
	   _('rat'),
	   _('penguin'),
	   _('python'),
	   ]

del _

# ...
for a in animals:
    print _(a)
</pre></div>

<p>
This works because the dummy definition of <tt class="function">_()</tt> simply returns
the string unchanged.  And this dummy definition will temporarily
override any definition of <tt class="function">_()</tt> in the built-in namespace
(until the <tt class="keyword">del</tt> command).
Take care, though if you have a previous definition of <tt class="function">_</tt> in
the local namespace.

<p>
Note that the second use of <tt class="function">_()</tt> will not identify ``a'' as
being translatable to the <b class="program">pygettext</b> program, since it is not
a string.

<p>
Another way to handle this is with the following example:

<p>
<div class="verbatim"><pre>
def N_(message): return message

animals = [N_('mollusk'),
           N_('albatross'),
	   N_('rat'),
	   N_('penguin'),
	   N_('python'),
	   ]

# ...
for a in animals:
    print _(a)
</pre></div>

<p>
In this case, you are marking translatable strings with the function
<tt class="function">N_()</tt>,<a name="tex2html184"
  href="#foot70438"><sup>21.5</sup></a> which won't conflict with any definition of
<tt class="function">_()</tt>.  However, you will need to teach your message extraction
program to look for translatable strings marked with <tt class="function">N_()</tt>.
<b class="program">pygettext</b> and <b class="program">xpot</b> both support this through the
use of command line switches.

<p>
<br><hr><h4>Footnotes</h4>
<dl>
<dt><a name="foot70438">...N_(),</a><A
 HREF="node741.html#tex2html184"><sup>21.5</sup></a></dt>
<dd>The choice of <tt class="function">N_()</tt> here is totally
arbitrary; it could have just as easily been
<tt class="function">MarkThisStringForTranslation()</tt>.


</dd>
</dl>
<div class="navigation">
<div class='online-navigation'>
<p></p><hr />
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="21.1.3.3 changing languages on"
  href="node740.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="21.1.3 internationalizing your programs"
  href="node737.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="21.1.3.5 gettext() vs. lgettext()"
  href="node742.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python Library Reference</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
<b class="navlabel">Previous:</b>
<a class="sectref" rel="prev" href="node740.html">21.1.3.3 Changing languages on</a>
<b class="navlabel">Up:</b>
<a class="sectref" rel="parent" href="node737.html">21.1.3 Internationalizing your programs</a>
<b class="navlabel">Next:</b>
<a class="sectref" rel="next" href="node742.html">21.1.3.5 gettext() vs. lgettext()</a>
</div>
</div>
<hr />
<span class="release-info">Release 2.5.1, documentation updated on 18th April, 2007.</span>
</div>
<!--End of Navigation Panel-->
<address>
See <i><a href="about.html">About this document...</a></i> for information on suggesting changes.
</address>
</body>
</html>
